/***********************************************************************************
 * 文件名： polsys_port.c
 * 版本： 1
 * 说明：
 * 		此为移植示例文件。大部分情况下可以不修改此文件直接使用，在 app.c 中添加自己的第一行
 * 代码。
 * 		特殊情况下你可能需要自行移植，你可以参考本文件中已有的移植代码。Polsys 的移植很简单，
 * 移植步骤如下：
 * 		1. 在系统启动后调用一次 Polsys_Init；
 * 		2. 接着调用 App_Load；
 * 		3. 然后循环调用 Polsys_Loop 来执行任务；
 * 		4. 最后需要在定时器中断中周期调用 Polsys_Tick 。
 * 		如需修改，尽量复制本文件到项目文件夹再修改，便于后期更新polsys不影响项目工程。
 * 修改记录：
 * 	2023/03/15: 初版。 刘言。
***********************************************************************************/
#include "polsys.h"



void App_Load();


#if (POLSYS_ENV_TYPE == 0)	// 未使用RTOS，main函数可自定义。

void SysTick_Handler(void)
{
	Polsys_Tick();
}

int main()
{
	//系统初始化
	Polsys_Init();
	//应用初始化
	App_Load();
	while(1)	// 不建议修改主循环中的内容
	{
		Polsys_Loop();
	}
}

#elif (POLSYS_ENV_TYPE == 1)	// MCU驱动初始化后不返回，有些MCU的SDK内置了RTOS并深度捆绑，调用SDK初始化函数后RTOS就跑起来了。

void SysTick_Handler(void)
{
	Polsys_Tick();
}

int main()
{
	Polsys_Init();
}

#elif (POLSYS_ENV_TYPE == 2)	// MCU驱动定义了main函数，有些MCU的SDK不开放main函数。

void SysTick_Handler(void)
{
	Polsys_Tick();
}

#elif (POLSYS_ENV_TYPE == 7)	// 使用了RT-Thread（可完全自主操作）

struct rt_semaphore mSemPolsys;	// 使用信号量来阻塞main线程

void SysTick_Handler(void)
{
	rt_interrupt_enter();
	rt_tick_increase();
	Polsys_Tick();
	rt_sem_release(&mSemPolsys);	// 释放信号量，进行任务就绪状态扫描（如果Polsys空闲将会等待信号量而阻塞，在这里释放。）
	rt_interrupt_leave();
}
int main()
{
	// 创建信号量
	rt_sem_init(&mSemPolsys, "s_pol", 0, RT_IPC_FLAG_FIFO);
	//系统初始化
	Polsys_Init();
	//应用初始化
	App_Load();
	
	while(1)	// 不建议修改主循环中的内容
	{
		Polsys_Loop();	// polsys 任务运行在 main 线程
	}
}

void Polsys_EventIdle()
{
	rt_sem_take(&mSemPolsys, RT_WAITING_FOREVER); // 阻塞线程，等待任何任务就绪。
}

/*
	注意： 在其他线程中 Polsys_SetTaskReady 后需要立即调用 rt_sem_release(SemPolsys) 让线程恢复去处理任务，否则任务还是要等到下一个tick才会被执行。
如果仅在polsys任务中调用 Polsys_SetTaskReady 不需要这么操作，任务将会尽快被执行。因此定义以下函数给应用层使用。
*/
FORCE_IN_LINE void Polsys_SetThreadReady()
{
	if(mSemPolsys.value == 0)rt_sem_release(&mSemPolsys);
}

#elif (POLSYS_ENV_TYPE == 8)	// 使用了FreeRTOS（可完全自主操作）
#error "not supported."
#endif



